Skip to content

docs(conventions): a step whose reference routes every exit still signposts#570

Open
leeovery wants to merge 1 commit into
fix/prose-asserter-judges-faultfrom
docs/conventions-reference-directed-routing
Open

docs(conventions): a step whose reference routes every exit still signposts#570
leeovery wants to merge 1 commit into
fix/prose-asserter-judges-faultfrom
docs/conventions-reference-directed-routing

Conversation

@leeovery

@leeovery leeovery commented Jul 26, 2026

Copy link
Copy Markdown
Owner

Summary

Discovery's Step 5 loads confirm-trigger.md and ends there. Every other step in that skill says where it goes next — so a reader reaching the blank line has one signal left, the next heading, and takes it. A walk did exactly that: read confirm-trigger's route to Step 7, talked itself into Step 6 because the file numbers it earlier, then caught itself and corrected.

The convention already anticipates most of this. A reference whose paths need different backbone steps overrides its caller, because "the caller's single → Proceed to line can only go one place, so the file overrides it." That wording assumes a line exists to be overridden — and for final-review.md it does: three of its eight exits return bare, and the caller's footer is what serves them.

confirm-trigger.md has no such exit. Every path routes, so any footer would name a step that never runs, and the step was left with nothing at all. That's the one shape with no documented form.

Two rules added under ### Load Directive Format:

  • Where every exit routes, the footer defers rather than naming a step: → On return, proceed as the reference directed.
  • A footer governs only the reference's bare → Return to caller. exits — never branches the reference routed itself. True already, unwritten, and what lets a reader over-apply a footer to all eight of final-review's exits when it serves three.
  • And: a step is never left with no footer. Silence reads as the end of the step, making the heading below the fall-through by default.

Applied to workflow-discovery Step 5. Behaviour is unchanged — the routing was always complete for anyone who read the reference; this makes it complete for someone who has just finished reading it.

Swept for other instances

Only two other footerless load-steps exist:

  • workflow-specification-entry Step 4 — terminal (invokes the processing skill), correct as-is.
  • workflow-bridge Step 2 — a different shape: six conditional branches, each a bare Load, none carrying routing. Reads against the every-branch-routes rule, though each continuation ends by invoking a skill, which is terminal and may be legitimately exempt. Surfaced, not touched.

Test plan

  • Conventions lint 29/29; prose gate 47/47
  • No simulation change: this adds a routing signpost, not an engine verb or a changed call sequence

🤖 Generated with Claude Code

Stack

  1. docs(design): prose-tests programme design log #544
  2. feat(prose-tests): the framework — cases, worlds, runner, skill #545
  3. test(prose): feature happy-path corpus — five worlds, seven cases #546
  4. test(prose): bugfix corpus — the investigation-centric surfaces #548
  5. test: retry recursive teardown removals — kill a class of phantom failures #549
  6. fix(entry-skills): close the handoff fences — six files render their arms wrong #550
  7. docs: a contributing page for working on the system #551
  8. fix(entry-skills): every handoff arm says to invoke the skill #552
  9. fix(implementation): environment setup belongs to the setup reference alone #553
  10. fix(prose-tests): the asserter is told which substitutions were armed #554
  11. feat(prose-tests): the mid-flow substitution, and a world only prose can describe #555
  12. test(prose): claims assert consequences, not what was displayed #556
  13. feat(prose-tests): record everything the agents do, results included #557
  14. fix(discussion-entry): the handoff reports the source it actually had #558
  15. fix(prose-tests): the stop hook records, and names the model that walked #559
  16. fix(prose-tests): command output was never actually recorded #560
  17. feat(prose-tests): judge the walk as told, not the summary returned #561
  18. feat(prose-tests): decide in code what an agent should not be deciding #562
  19. test(prose): a case starts where a session starts #563
  20. feat(prose-tests): walk on Sonnet, judge on Opus, escalate a failure #564
  21. test(prose): give the eight read-only cases something that can fail #565
  22. test(prose): only walks that can be observed, and checks that survive the trip #566
  23. fix(prose-tests): the verdict names only the model the record names #567
  24. test(prose): discovery, walked to the point where work first exists #568
  25. fix(prose-tests): the asserter judges which of prose or walker was at fault #569
  26. docs(conventions): a step whose reference routes every exit still signposts #570 👈 current
  27. test(prose): discovery's epic arm, to the same durability boundary #571

…nposts

Discovery's Step 5 loads confirm-trigger and ends there. Every other step
in that skill says where it goes next, so a reader arriving at the blank
line has one signal left — the next heading — and takes it. A walk did
exactly that: read confirm-trigger's route to Step 7, talked itself into
Step 6 because the file numbers it earlier, then caught itself.

The convention already anticipates most of this. A reference whose paths
need different backbone steps overrides its caller, because "the caller's
single Proceed to line can only go one place". That wording assumes a
line exists to be overridden, and for final-review.md it does — three of
its eight exits return bare and the caller's footer is what serves them.
confirm-trigger has no such exit. Every path routes, so any footer would
name a step that never runs, and the step was left with nothing at all.

That is the shape with no documented form, and it now has one: the footer
defers rather than naming a step. The rule also states what a footer
governs — the bare returns only, never the branches the reference routed
itself — which was true already and unwritten, and is what lets a reader
over-apply a footer to all eight of final-review's exits when it serves
three.

A step is never left with no footer. Silence reads as the end of the
step, and the heading below becomes the fall-through by default.

Behaviour is unchanged: the routing was always complete for anyone who
read the reference. This makes it complete for someone who has just
finished reading it.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This was referenced Jul 26, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant